﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace BMS.Utilities
{
    public static class NumberUtil
    {
        public static String changeNumericToWords(double numb)
        {
            String num = numb.ToString();
            return changeToWords(num, false);
        }
        public static String changeCurrencyToWords(String numb)
        {
            return changeToWords(numb, true);
        }
        public static String changeNumericToWords(String numb)
        {
            return changeToWords(numb, false);
        }
        public static String changeCurrencyToWords(double numb)
        {
            return changeToWords(numb.ToString(), true);
        }
        private static String changeToWords(String numb, bool isCurrency)
        {
            String val = "", wholeNo = numb, points = "", andStr = "", pointStr = "";
            String endStr = (isCurrency) ? ("Only") : ("");
            try
            {
                int decimalPlace = numb.IndexOf(".");
                if (decimalPlace > 0)
                {
                    wholeNo = numb.Substring(0, decimalPlace);
                    points = numb.Substring(decimalPlace + 1);
                    if (Convert.ToInt32(points) > 0)
                    {
                        andStr = (isCurrency) ? ("and") : ("point");// just to separate whole numbers from points/cents
                        endStr = (isCurrency) ? ("Cents " + endStr) : ("");
                        pointStr = translateCents(points);
                    }
                }
                val = String.Format("{0} {1}{2} {3}", translateWholeNumber(wholeNo).Trim(), andStr, pointStr, endStr);
            }
            catch { ;}
            return val;
        }
        private static String translateWholeNumber(String number)
        {
            string word = "";
            try
            {
                bool beginsZero = false;//tests for 0XX
                bool isDone = false;//test if already translated
                double dblAmt = (Convert.ToDouble(number));
                //if ((dblAmt > 0) && number.StartsWith("0"))
                if (dblAmt > 0)
                {//test for zero or digit zero in a nuemric
                    beginsZero = number.StartsWith("0");
                    int numDigits = number.Length;
                    int pos = 0;//store digit grouping
                    String place = "";//digit grouping name:hundres,thousand,etc...
                    switch (numDigits)
                    {
                        case 1://ones' range
                            word = ones(number);
                            isDone = true;
                            break;
                        case 2://tens' range
                            word = tens(number);
                            isDone = true;
                            break;
                        case 3://hundreds' range
                            pos = (numDigits % 3) + 1;
                            place = " Hundred ";
                            break;
                        case 4://thousands' range
                        case 5:
                        case 6:
                            pos = (numDigits % 4) + 1;
                            place = " Thousand ";
                            break;
                        case 7://millions' range
                        case 8:
                        case 9:
                            pos = (numDigits % 7) + 1;
                            place = " Million ";
                            break;
                        case 10://Billions's range
                            pos = (numDigits % 10) + 1;
                            place = " Billion ";
                            break;
                        //add extra case options for anything above Billion...
                        default:
                            isDone = true;
                            break;
                    }
                    if (!isDone)
                    {//if transalation is not done, continue...(Recursion comes in now!!)
                        word = translateWholeNumber(number.Substring(0, pos)) + place + translateWholeNumber(number.Substring(pos));
                        //check for trailing zeros
                        if (beginsZero) word = " and " + word.Trim();
                    }
                    //ignore digit grouping names
                    if (word.Trim().Equals(place.Trim())) word = "";
                }
            }
            catch { ;}
            return word.Trim();
        }
        private static String tens(String digit)
        {
            int digt = Convert.ToInt32(digit);
            String name = null;
            switch (digt)
            {
                case 10:
                    name = "Ten";
                    break;
                case 11:
                    name = "Eleven";
                    break;
                case 12:
                    name = "Twelve";
                    break;
                case 13:
                    name = "Thirteen";
                    break;
                case 14:
                    name = "Fourteen";
                    break;
                case 15:
                    name = "Fifteen";
                    break;
                case 16:
                    name = "Sixteen";
                    break;
                case 17:
                    name = "Seventeen";
                    break;
                case 18:
                    name = "Eighteen";
                    break;
                case 19:
                    name = "Nineteen";
                    break;
                case 20:
                    name = "Twenty";
                    break;
                case 30:
                    name = "Thirty";
                    break;
                case 40:
                    name = "Fourty";
                    break;
                case 50:
                    name = "Fifty";
                    break;
                case 60:
                    name = "Sixty";
                    break;
                case 70:
                    name = "Seventy";
                    break;
                case 80:
                    name = "Eighty";
                    break;
                case 90:
                    name = "Ninety";
                    break;
                default:
                    if (digt > 0)
                    {
                        name = tens(digit.Substring(0, 1) + "0") + " " + ones(digit.Substring(1));
                    }
                    break;
            }
            return name;
        }
        private static String ones(String digit)
        {
            int digt = Convert.ToInt32(digit);
            String name = "";
            switch (digt)
            {
                case 1:
                    name = "One";
                    break;
                case 2:
                    name = "Two";
                    break;
                case 3:
                    name = "Three";
                    break;
                case 4:
                    name = "Four";
                    break;
                case 5:
                    name = "Five";
                    break;
                case 6:
                    name = "Six";
                    break;
                case 7:
                    name = "Seven";
                    break;
                case 8:
                    name = "Eight";
                    break;
                case 9:
                    name = "Nine";
                    break;
            }
            return name;
        }
        private static String translateCents(String cents)
        {
            String cts = "", digit = "", engOne = "";
            for (int i = 0; i < cents.Length; i++)
            {
                digit = cents[i].ToString();
                if (digit.Equals("0"))
                {
                    engOne = "Zero";
                }
                else
                {
                    engOne = ones(digit);
                }
                cts += " " + engOne;
            }
            return cts;
        }

        //public static String NumWordsWrapper(double n)
        //{
        //    string words = "";
        //    double intPart;
        //    double decPart = 0;
        //    if (n == 0)
        //        return "Zero";
        //    try
        //    {
        //        string[] splitter = n.ToString().Split('.');
        //        intPart = double.Parse(splitter[0]);
        //        decPart = double.Parse(splitter[1]);
        //    }
        //    catch
        //    {
        //        intPart = n;
        //    }

        //    words = NumWords(intPart);

        //    if (decPart > 0)
        //    {
        //        if (words != "")
        //            words += " And ";
        //        int counter = decPart.ToString().Length;
        //        switch (counter)
        //        {
        //            case 1: words += NumWords(decPart) ; break;
        //            case 2: words += NumWords(decPart) ; break;
        //            case 3: words += NumWords(decPart) ; break;
        //            case 4: words += NumWords(decPart) ; break;
        //            case 5: words += NumWords(decPart) ; break;
        //            case 6: words += NumWords(decPart) ; break;
        //            case 7: words += NumWords(decPart) ; break;
        //        }

        //        words += " Cents";
        //    }
        //    return words;
        //}

        //public static String NumWords(double n) //converts double to words
        //{
        //    string[] numbersArr = new string[] { "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen" };
        //    string[] tensArr = new string[] { "Twenty", "Thirty", "Fourty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninty" };
        //    string[] suffixesArr = new string[] { "Thousand", "Million", "Billion", "Trillion", "Quadrillion", "Quintillion", "Sextillion", "Septillion", "Octillion", "Nonillion", "Decillion", "undecillion", "Duodecillion", "Tredecillion", "Quattuordecillion", "Quindecillion", "Sexdecillion", "Septdecillion", "Octodecillion", "Novemdecillion", "Vigintillion" };
        //    string words = "";

        //    bool tens = false;

        //    if (n < 0)
        //    {
        //        words += "Negative ";
        //        n *= -1;
        //    }

        //    int power = (suffixesArr.Length + 1) * 3;

        //    while (power > 3)
        //    {
        //        double pow = Math.Pow(10, power);
        //        if (n > pow)
        //        {
        //            if (n % Math.Pow(10, power) > 0)
        //            {
        //                words += NumWords(Math.Floor(n / pow)) + " " + suffixesArr[(power / 3) - 1] + ", ";
        //            }
        //            else if (n % pow > 0)
        //            {
        //                words += NumWords(Math.Floor(n / pow)) + " " + suffixesArr[(power / 3) - 1];
        //            }
        //            n %= pow;
        //        }
        //        power -= 3;
        //    }
        //    if (n >= 1000)
        //    {
        //        if (n % 1000 > 0) words += NumWords(Math.Floor(n / 1000)) + " Thousand, ";
        //        else words += NumWords(Math.Floor(n / 1000)) + " Thousand";
        //        n %= 1000;
        //    }
        //    if (0 <= n && n <= 999)
        //    {
        //        if ((int)n / 100 > 0)
        //        {
        //            words += NumWords(Math.Floor(n / 100)) + " Hundred";
        //            n %= 100;
        //        }
        //        if ((int)n / 10 > 1)
        //        {
        //            if (words != "")
        //                words += " ";
        //            words += tensArr[(int)n / 10 - 2];
        //            tens = true;
        //            n %= 10;
        //        }

        //        if (n < 20 && n > 0)
        //        {
        //            if (words != "" && tens == false)
        //                words += " ";
        //            words += (tens ? "-" + numbersArr[(int)n - 1] : numbersArr[(int)n - 1]);
        //            n -= Math.Floor(n);
        //        }
        //    }

        //    return words;

        //}
    }
}